/**
 * @file dy_injected.ts
 * @description 淘宝网络请求劫持注入脚本
 */
import type { PlasmoCSConfig } from "plasmo"

export const config: PlasmoCSConfig = {
  // 需要注入的网站url
  matches: [
    // 淘宝使用script类型获取
    "https://market.m.taobao.com/app/mtb/live-professional-screen/*"
  ],
  world: "MAIN",
  run_at: "document_start"
}

/**
 * 此为淘宝直播数据大屏api拦截的注入脚本
 * 由于淘宝使用自家的mtop库进行数据请求，无法直接使用xhr或fetch拦截
 * 所以这里直接改造mtop库的request方法，对请求进行拦截
 */

// 检测淘宝的mtop库是否加载完成

const _inject_handle = {
  apply: function (target: any, thisArg: any, argumentsList: any[]) {
    const { api, data } = argumentsList[0]
    // 消息传递
    window.dispatchEvent(
      new CustomEvent("hijackTbEvent", {
        detail: { api: api, data: data }
      })
    )
    return target.apply(thisArg, argumentsList)
  }
}
// 使用 Proxy 监控 window.lib 的赋值情况
const libProxyHandler = {
  set: function (target: any, key: string, value: any) {
    if (key === "mtop") {
      // // 使用 Proxy 监控 window.lib.mtop 的赋值情况
      value = new Proxy(value, {
        set: function (mtopTarget, mtopKey, mtopValue) {
          // 只对request进行劫持
          if (mtopKey === "request") {
            console.log("mtop.request劫持成功")
            const originRequest = mtopValue
            mtopTarget[mtopKey] = function (
              params: any,
              successCallback: Function,
              failureCallback: Function
            ) {
              // 只对 successCallback 进行劫持
              const processFunc = new Proxy(successCallback, _inject_handle)
              // 调用原来的 request 方法
              return originRequest.call(
                this,
                params,
                processFunc,
                failureCallback
              )
            }
          } else {
            mtopTarget[mtopKey] = mtopValue
          }
          return true
        }
      })
    }
    target[key] = value
    return true
  }
}

// 代理 window.lib 对象
window["lib"] = new Proxy(window["lib"] || {}, libProxyHandler)
